//
//  DispatchSemaphoreDemo.h
//  GCDDemo
//
//  Created by kingboyrang on 2021/10/30.
//  Copyright © 2021 wulanzhou. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN


/**
==========================================================================================
 GCD 中的信号量是指 Dispatch Semaphore，是持有计数的信号。类似于过高速路收费站的栏杆。可以通过时，打开栏杆，不可以通过时，关闭栏杆。在 Dispatch Semaphore 中，使用计数来完成这个功能，计数小于 0 时等待，不可通过。计数为 0 或大于 0 时，计数减 1 且不等待，可通过。
 
 信号量为 0 阻塞线程，
 大于 0 则不会阻塞，通过改变信号量的值，来控制阻塞
 
 Dispatch Semaphore 提供了三个方法：

 dispatch_semaphore_create：创建一个 Semaphore 并初始化信号的总量
 dispatch_semaphore_signal：发送一个信号，让信号总量加 1
 dispatch_semaphore_wait：可以使总信号量减 1，信号总量小于 0 时就会一直等待（阻塞所在线程），否则就可以正常执行。
 注意：信号量的使用前提是：想清楚你需要处理哪个线程等待（阻塞），又要哪个线程继续执行，然后使用信号量。

==========================================================================================
 Dispatch Semaphore 在实际开发中主要用于：

 1.保持线程同步，将异步执行任务转换为同步执行任务
 2.保证线程安全，为线程加锁
 
 */
@interface DispatchSemaphoreDemo : NSObject

/**
   保持线程同步,将异步执行任务转换为同步执行任务1
 */
- (NSString *)asyncConvertSyncTask1;

/**
   保持线程同步,将异步执行任务转换为同步执行任务2
 */
- (void)asyncConvertSyncTask2;

/**
 保证线程安全，为线程加锁
 */
- (void)queueLock;

/**
 说明：A、B、C、D四个线程，A、B执行完成后才执行C、D,通过信号量控制
 */
- (void)semaphoreTaskQueue;

@end

NS_ASSUME_NONNULL_END
